package util;

import java.sql.*;
import javax.swing.JOptionPane;

/**
 * Classe de camada de persistência, faz a conexão com o banco de dados.
 * @author Owner
 */
public abstract class Conexao {
    private Connection c;

    
    /**
     * Construtor que abre a conexão com o banco de dados específico.
     */
    public Conexao() {
	String driverName = "com.mysql.jdbc.Driver";
	String usuario = Constantes.loginMySQL;
	String senha = Constantes.senhaMySQL;
	String endereco = Constantes.endereco;
	try {
	    Class.forName(driverName);
	} catch (ClassNotFoundException e1) {
	    e1.printStackTrace();
	}

	try {	
	    connect(usuario, senha, endereco );
	} catch (SQLException E) {
	    System.err.println("SQLException: " + E.getMessage());
	    System.err.println("SQLState:     " + E.getSQLState());
	    System.err.println("VendorError:  " + E.getErrorCode());
	    if( E.getMessage().equals("Unknown database '"+Constantes.endereco+"'"))
		JOptionPane.showMessageDialog(null, "Seu banco de dados esta corrompido!");
	    else
		JOptionPane.showMessageDialog(null, "Não foi possíel se conectar ao Banco de Dados!");
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    /**
     * Realiza a conexão
     * @param usuario
     * @param senha
     * @param endereco
     * @throws SQLException
     */
    private void connect(String usuario, String senha, String endereco) throws SQLException {
	c = DriverManager.getConnection( endereco , usuario , senha);	
    }

    /**
     * Executa a query de modo a prevenir SQL injection
     * @param sql
     * @param values
     * @return ResultSet
     * @throws SQLException
     */
    public ResultSet queryProtect(String sql, String[] values) throws SQLException {
	ResultSet table;
	PreparedStatement s = c.prepareStatement(sql);
	s.setString(1, values[0]); 
	s.setString(2, values[1]); 
	table = s.executeQuery();

	return table;
    }

    /**
     * Executa a query
     * @param sql
     * @throws SQLException
     */
    public void execute(String sql) throws SQLException{
	Statement s = c.createStatement();
	s.execute(sql);
    }

    /**
     * Executa uma query para atualizar os valores
     * @param sql
     * @throws SQLException
     */
    public void update(String sql) throws SQLException { 
	Statement s = c.createStatement();
	s.executeUpdate(sql);
    }

    /**
     * Executa a query e retorna uma tabela com os resultados
     * @param sql
     * @return ResultSet
     * @throws SQLException
     */
    public ResultSet query(String sql) throws SQLException {
	ResultSet table;
	Statement s = c.createStatement();
	table = s.executeQuery(sql);
	return table;
    }

    /**
     * Fecha a conexão
     * @throws SQLException
     */
    public void close() throws SQLException {
	c.close();
    }
}